package com.kaifa.org.tp03.example02.proxy;
import com.kaifa.org.tp03.example02.aspect.AopAspect;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

/**
 * CGlib代理
 * 为接口创建代理对象
 * 也可以为普通类创建代理对象
 */
public class CglibProxy implements MethodInterceptor {
    /**
     * 创建代理
     * @param obj 接口类
     * @return
     */
    public Object createProxy(Object obj){
//        创建动态的类
        Enhancer enhancer = new Enhancer();
//        设置父类
        enhancer.setSuperclass(obj.getClass());
//        回调
        enhancer.setCallback(this);
//        创建代理类
        Object object=enhancer.create();
        return object;
    }

    /**
     * 生成代理对象
     * @param o 对象，cglib根据父类生成的代理对象
     * @param method 拦截方法
     * @param objects 参数组
     * @param methodProxy 方法的代理对象，用于执行父类的方法
     * @return
     * @throws Throwable
     */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//        1、创建切面类
        AopAspect aopAspect = new AopAspect();
//        2、调用权限处理方法
        aopAspect.checkPermission();
//        3、处理接口实现方法
        Object obj=methodProxy.invokeSuper(o,objects);
//        4、记录日志
        aopAspect.log();
        return obj;
    }
}
